package basic

/**
 * 基础知识
 */
fun main() {
    // 变量声明
    var ar = 100  //var 声明一个可变的变量
    ar = 10
    println("可变的变量 $ar")

    val al = 10 // val 声明一个不可变的变量
    // b=100 报错
    println("不可变的变量 $al")

    val intValue: Int = 10
    val longValue: Long = 10L
    val longValue1 = intValue.toLong()
    println("int转成为long  $intValue  $longValue1")

    //无符号
    val ui: UInt = 111u//声明一个无符号的Int变量
    val ul: ULong = 111u//声明一个无符号的Long变量

    //    \t——制表符
    //    \b——退格符
    //    \n——换行（LF）
    //    \r——回车（CR）
    //    \'——单引号
    //    \"——双引号
    //    \\——反斜杠
    //    \$——美元符

    //字符串
    val s: String = "123456789"
    println("s $s")

    // 范围用法 ..     step 跳几个
    val range = 1..10
    for (i in range step 1) {
        if (i == 5) continue
        if (i == 8) break
        println("范围循环 $i")
    }

    //when关键字用法 相当于java的switch
    val wi: Int = 4
    when (wi) {
        1, 3 -> println("when用法 ：这是1或者3")
        2 -> println("when用法 ：这是2")
        else -> println("when用法 ：这是其他")
    }

    //函数调用
    val sum1 = sum(5, 10)
    val sum2 = sumDefaultValue(5)
    val sum3 = sunPro(5, 10)
    val sum4 = operationTest(3, 5) { x, y ->
        x + y
    }
    println("   sum1=$sum1   sum2=$sum2  sum3=$sum3  sum4=$sum4");

    //内联函数
    measureTime() {
        println("我是内联函数")
    }

    //位移运算
    println("4 shl 2 ${4 shl 2}")
    println("4 shr 2 ${16 shr 2}")

    //可变长参数
    variableTestInt(1, 2, 3, 4)

    //可变长参数
    val arrayParams: Array<String> = arrayOf("AAA", "BBB", "CCC", "DDDD")
    variableTestString(*arrayParams)
}

//定义函数
fun sum(a: Int, b: Int): Int {
    return a + b;
}

//定义函数 默认值
fun sumDefaultValue(a: Int = 1, b: Int = 2): Int {
    return a + b;
}

//定义函数 :函数中只有一行代码时 允许不编写函数体
fun sunPro(a: Int, b: Int) = a + b;


//高阶函数
fun operationTest(a: Int, b: Int, operation: (Int, Int) -> Int): Int {
    return operation(a, b)
}

//内联函数
inline fun measureTime(block: () -> Unit) {
    val start = System.currentTimeMillis()
    block()
    println("执行时间: ${System.currentTimeMillis() - start}ms")
}

//可变长参数
fun variableTestInt(vararg array: Int) {
    for (i in array) {
        println("可变长参数 $i")
    }
}


//可变长参数
fun variableTestString(vararg array: String) {
    for (i in array) {
        println("可变长参数 $i")
    }
}
